package com.woniuxy.sender;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.UUID;


/**
 * @Author: 曾令忠
 * @Description: 向交换机发数据
 * @Date: 2020/7/6 0006-上午 10:42
 */
@Component
public class AckSender implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback{
    @Autowired
    public RabbitTemplate rabbitTemplate;

    //设置回调
    @PostConstruct //次注解在对象创建完毕，注入完毕后会自动调用
    public void init(){
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnCallback(this);
    }

    public void send(String msg){
        //给消息绑定id
        String id = UUID.randomUUID().toString();
        id = id.replaceAll("-","");
        //发送的消息id
        System.out.println("发送的消息id："+id);
        CorrelationData correlationData = new CorrelationData();
        correlationData.setId(id);
       rabbitTemplate.convertAndSend("senderDirectExchange","news",msg,correlationData);
    }

    /**
     * 不管是否接收到消息都会自动调用此方法，无法到达时交换机会返回此消息的id
     * @param correlationData 消息
     * @param b 是否到达交换机
     * @param s 如果没到达交换机就是具体的错误信息
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
        if(b){
//            System.out.println("消息到达交换机");
        }else{
            System.out.println("接收到的消息id："+correlationData.getId());
            System.out.println(s);
            //如果无法到达指定的交换机，通常的做法是：每隔一段时间可以多尝试几次，或者将消息发给备份的交换机，以保障消息能正常发出去
        }
    }

    /**
     * 消息无法到达队列时会自动调用该方法，如果到达则不调用
     * @param message 消息内容的封装
     * @param i 响应码
     * @param s 消息无法到达队列的原因
     * @param s1 消息无法到达哪个交换机
     * @param s2 路由
     */
    @Override
    public void returnedMessage(Message message, int i, String s, String s1, String s2) {
        System.out.println("消息没有到达:");
        System.out.println("消息内容："+new String(message.getBody()));
        System.out.println(i);
        System.out.println(s);
        System.out.println(s1);
        System.out.println(s2);
        /*没有到达消息队列可能的原因：
                1.消息队列不存在
                2.消息队列和交换机没有绑定
                3.路由错误
         */

    }


}
